<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Promise的API</title>
	</head>
	<body>
		<!-- 
			1. Promise构造函数: new Promise (executor)
						executor函数: 是同步执行的，(resolve, reject) => {}
						resolve函数: 调用resolve将Promise实例内部状态改为成功(fulfilled)。
						reject函数: 调用reject将Promise实例内部状态改为失败(rejected)。
						说明: excutor函数会在Promise内部立即同步调用,异步代码放在excutor函数中。

			2. Promise.prototype.then方法: Promise实例.then(onFulfilled,onRejected)
						onFulfilled: 成功的回调函数 (value) => {}
						onRejected: 失败的回调函数 (reason) => {}
						特别注意(难点)：then方法会返回一个新的Promise实例对象

			3. Promise.prototype.catch方法: Promise实例.catch(onRejected)
						onRejected: 失败的回调函数 (reason) => {}
						说明: catch方法是then方法的语法糖, 相当于: then(undefined, onRejected)

			4. Promise.resolve方法: Promise.resolve(value)
						说明: 用于快速返回一个状态为fulfilled或rejected的Promise实例对象
						备注：value的值可能是：(1)非Promise值  (2)Promise值

			5. Promise.reject方法: Promise.reject方法(reason)
						说明: 用于快速返回一个状态必为rejected的Promise实例对象
			
			6. Promise.all方法: Promise.all(promiseArr)
						promiseArr: 包含n个Promise实例的数组
						说明: 返回一个新的Promise实例, 只有所有的promise都成功才成功, 只要有一个失败了就直接失败。
					
			7. Promise.race方法: Promise.race(promiseArr)
						promiseArr: 包含n个Promise实例的数组
						说明: 返回一个新的Promise实例, 成功还是很失败？以最先出结果的promise为准。
	-->

	<script type="text/javascript" >
		
		//验证then的返回值是Promise实例（暂且不研究其后续状态的切换）
		/* const p = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				resolve('hello')
			},1000)
		})
		const x = p.then(
			value => {console.log('成功了',value)},
			reason => {console.log('失败了',reason)}
		)
		console.log('@',x) */

		//测试一下catch方法
		/* const p = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				reject('hello')
			},1000)
		})
		p.catch(
			reason => {console.log('失败了',reason)}
		) */

		//测试一下Promise.resolve
		/* const p0 = new Promise((resolve,reject)=>{
			resolve('hello')
		})
		const p1 = Promise.resolve('hello')
		console.log(p0,p1) */

		//测试一下Promise.reject
		/* const p0 = new Promise((resolve,reject)=>{
			reject('hello')
		})
		const p1 = Promise.reject('hello')
		console.log(p0,p1) */

		//特殊情况一
		// const p0 = Promise.reject(-100)
		// const p1 = Promise.resolve(p0)
		// console.log(p1)

		//特殊情况二
		// const p0 = Promise.resolve(100)
		// const p1 = Promise.reject(p0)
		// console.log(p1)

		//测试一下Promise.all
		/* const p1 = Promise.resolve('a')
		const p2 = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				reject('b')
			},1000)
		})
		const p3 = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				reject('c')
			},1000)
		})
		
		const p = Promise.all([p1,p2,p3])
		p.then(
			value => {console.log('成功了',value)},
			reason => {console.log('失败了',reason)}
		) */

		//测试Promise.race()
		/* const p1 = Promise.resolve('a')
		const p2 = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				resolve('b')
			},1000)
		})
		const p3 = new Promise((resolve,reject)=>{
			setTimeout(()=>{
				reject('c')
			},1000)
		}) */
		
		const p = Promise.race([p2,p3])
		p.then(
			value => {console.log('成功了',value)},
			reason => {console.log('失败了',reason)}
		)
	</script>
	</body>
</html>